package com.sharing;

/**
 * Sychnorized 关键字也可以加在方法上
 * 那么方法我们知道
 * 分两种：普通方法、静态方法(static修饰)
 * 那么当然 Sychnorized 关键字，加在普通方法和静态方法上也是有区别的
 * 具体来看代码
 */
public class SychnorizedOnMethod {
    /**
     * 加在普通方法上
     * 那么test1是等价于test2的
     * 我们看test2，synchronized中锁的对象是this，也就是当前的【实例对象】
     * 注意，是实例对象，只会锁住当前实例
     * 意味着由该类创建的其他对象，其他线程依旧可以访问，但是该对象被锁，其他线程无法访问
     * 比如说这个类创建了3个对象
     * 那么线程1调用对象1，线程2调用对象2，线程3调用对象3，都不会阻塞
     * 但是如果线程1、2、3都调用对象1，那么谁拿到锁谁可以执行，其他两个阻塞等待
     */
    public synchronized void test1() {

    }

    public void test2() {
        synchronized (this) {

        }
    }

    /**
     * 加在静态方法上
     * 那么test3是等价于test4的
     * 我们看test4，synchronized 中锁的对象是SychnorizedOnMethod.class，也就是【当前类】
     * 注意，是当前类，只会锁住当前类
     * 意味着由该类创建的所有对象，同一时刻，只能有一个线程访问到，锁的面积更大了
     */
    public static synchronized void test3() {

    }

    public static void test4() {
        synchronized (SychnorizedOnMethod.class) {
        }
    }

    /**
     * 不加synchronized关键字的方法，就好比不遵守规则的人，不老实排队(比如翻窗户进)
     */
    public void test5() {

    }

    public static void test6() {

    }
}
